classdef (CaseInsensitiveProperties = true) node
	properties
		representation = []; % Representacion del estado que codifica el nodo
        parent_rep = [] % Representacion del nodo padre
		parent = []; % Indice del nodo padre
		children = []; % tiene que tener las representaciones de los hijos
		value = []; % Valor del nodo
		nvisits = []; % Cantidad de veces que fue visitado en el proceso de planeamiento
		index = []; % Indice del nodo
        treeLayer = [] % Capa del arbol a la que pertenece este nodo
    end
    methods
        % Funcion creadora
        function self = node(representation,parent_rep,parent_index,ind,layer)
            self.representation = representation;
            self.parent_rep = parent_rep;
            self.parent = parent_index;
            self.children = []; % tiene que tener los  de los hijos
            self.value = [];
            self.nvisits = 0;
            self.index = ind;
            self.treeLayer = layer;
        end
        function self = addChild(self,child)
            self.children(end+1) = child;
        end

        function self = updateValue(self,val)
            self.value=val;
        end
        
        function self = addVisit(self)
            self.nvisits = self.nvisits + 1;
        end
	
        function eq = eqNode(node1,node2,varargin)
            % Considero que dos nodos son equivalentes si y solo si
            % coinciden su representacion y la representacion de su nodo
            % padre. O sea que tomo una profundidad de 1 paso para la
            % equivalencia.
            if isempty(varargin)
                if ~isa(node2,'node')
                    error('Comparing a node object with a non node object without supplementing parent_index');
                else
                    flag = 0;
                end
            else % Si el node2 solo contiene la representacion y es un objeto node hay que suministrar un parametro extra que el parent_index
                if isa(node2,'node')
                    node2 = node2.representation;
                elseif not(isnumeric(node2))
                    error('Wrong data type for comparison between nodes');
                end
                flag = 1;
                layer = varargin{1};
%                 if length(varargin)==2
%                     parent2 = varargin{2};
%                     flag = 2;
%                 end
            end
            if flag == 0
                if node1.representation == node2.representation && node1.treeLayer==node2.treeLayer...
%                         && node1.parent_rep == node2.parent_rep
                    eq = true;
                else
                    eq = false;
                end
            elseif flag == 1
                if node1.representation == node2 && node1.treeLayer == layer
                    eq = true;
                else
                    eq = false;
                end
            elseif flag == 2
                if node1.representation == node2 && node1.treeLayer == layer ...
%                         && node1.parent_rep == parent2
                    eq = true;
                else
                    eq = false;
                end
            end
        end
    end
end